package com.zyht.common.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import freemarker.cache.FileTemplateLoader;
import freemarker.cache.StringTemplateLoader;
import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;

/**
 * <b>描述：</b>	使用Freemaker读取并渲染模板<br/>
 * <b>作者：</b>Bob <br/>
 * <b>修改日期：</b>2016年5月19日 - 下午4:47:03<br/>
 */
public class FreemarkerUtil {

	private Logger logger = LoggerFactory.getLogger(getClass());
	
	private FreemarkerUtil(){}
	
	/**
	 * <b>作者:</b> Bob<br/>
	 * <b>修改时间：</b>2016年5月19日 - 下午4:49:51<br/>
	 * <b>功能说明：</b>不使用单例<br/>
	 * @return
	 */
	public static FreemarkerUtil getBean(){
		return new FreemarkerUtil();
	}
	
	/**
	 * <b>作者:</b> Bob<br/>
	 * <b>修改时间：</b>2016年5月19日 - 下午4:48:12<br/>
	 * <b>功能说明：</b>	使用字符串模板<br/>
	 * @param src
	 * @param params
	 * @return
	 */
	public String getReplacedStr(String src, Map<String, Object> params){
		Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
		StringTemplateLoader loader = new StringTemplateLoader();
		loader.putTemplate("urlTemplate", src);
		configuration.setTemplateLoader(loader);
		StringWriter sw = new StringWriter();
		try {
			Template template = configuration.getTemplate("urlTemplate", "UTF-8");
			template.process(params, sw);
			return sw.toString();
		} catch (IOException e) {
			logger.error("读取模板["+src+"]失败！");
		} catch (TemplateException e) {
			logger.error("渲染模板["+src+"]错误！");
		}finally{
			try {
				sw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	
	/**
	 * <b>作者:</b> Bob<br/>
	 * <b>修改时间：</b>2016年5月19日 - 下午4:47:55<br/>
	 * <b>功能说明：</b>	使用文件模板<br/>
	 * @param templatePath
	 * @param templateName
	 * @param fileName
	 * @param map
	 * @throws IOException
	 */
	public void renderFile(String templatePath, String templateName,String fileName, Map<String, Object> map) throws IOException{
		Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
		FileTemplateLoader loader = new FileTemplateLoader(new File(templatePath));
		configuration.setTemplateLoader(loader);
		Template template = configuration.getTemplate(templateName);
		FileOutputStream out = new FileOutputStream(fileName);
		OutputStreamWriter osw = new OutputStreamWriter(out);
		try{
			template.process(map, osw);
		} catch (TemplateException e){
			e.printStackTrace();
		}finally{
			osw.close();
			out.close();
		}
	}
	
	/**
	 * <b>作者:</b> Bob<br/>
	 * <b>修改时间：</b>2016年8月20日 - 下午5:50:42<br/>
	 * <b>功能说明：</b>	根据模板地址和名称渲染模板，并返回渲染后的字符串表示<br/>
	 * @param templateFolderPath
	 * @param templateFileName
	 * @param map
	 * @return
	 */
	public String renderFile(String templateFolderPath, String templateFileName, Map<String, Object> map){
		Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
		StringWriter sw = new StringWriter();
		try{
			FileTemplateLoader loader = new FileTemplateLoader(new File(templateFolderPath));
			configuration.setTemplateLoader(loader);
			Template template = configuration.getTemplate(templateFileName);
			template.process(map, sw);
		} catch (TemplateException e){
			e.printStackTrace();
		} catch (TemplateNotFoundException e){
			e.printStackTrace();
		} catch (MalformedTemplateNameException e){
			e.printStackTrace();
		} catch (ParseException e){
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		}finally{
			try{
				sw.close();
			} catch (IOException e){
				e.printStackTrace();
			}
		}
		return sw.toString();
	}
}
